package com.yeyks.commonReference.service.account;

import com.baomidou.mybatisplus.extension.service.IService;
import com.yeyks.account.dal.domain.AccountInfo;
import com.yeyks.account.param.AccountInfoQueryParam;
import com.yeyks.common.appcommon.dto.account.AppAccountDTO;
import com.yeyks.common.appcommon.json.JsonBankInfo;
import com.yeyks.common.appcommon.param.account.*;
import com.yeyks.common.appcommon.result.CommonPage;
import com.yeyks.common.appcommon.result.CommonResult;
import com.yeyks.common.base.PageResult;
import com.yeyks.common.exception.TokenInvalidException;
import com.yeyks.common.param.member.MemberCardOperatorListParam;
import com.yeyks.common.result.member.MemberCardOperatorListResult;
import com.yeyks.commonReference.pojo.dto.AddSysUserDTO;
import com.yeyks.commonReference.pojo.param.AddBusinessParam;
import com.yeyks.commonReference.pojo.param.QueryBusinessParam;
import com.yeyks.consumer.dal.domain.UserInfo;

import java.util.List;
import java.util.Map;


/**
 * <p>
 * 后台帐户表 服务类
 * </p>
 *
 * @author yun
 * @since 2019-06-25
 */
public interface AccountInfoService extends IService<AccountInfo> {

    /**
     * Token到用户Id
     *
     * @param token
     * @return
     */
    Integer token2UserId(String token) throws TokenInvalidException;


    /**
     * 判断给定的所有房间ID，是否都具有操作权限
     *
     * @param loginUserId
     * @param ids
     * @return
     */
    boolean roomHavePermission(Integer loginUserId, List<Integer> ids);

    /**
     * 获得Token对应账户信息
     *
     * @param token
     * @return
     * @throws Exception
     */
    AccountInfo token2AccountInfo(String token);

//    /**
//     * 设置抽成比例
//     *
//     * @param admin
//     * @param branch
//     * @param city
//     * @return
//     */
//    void setPrecentage(Integer admin, Integer branch, Integer city) throws Exception;

    List<AccountInfo> queryPageList(AccountInfoQueryParam accountInfoQueryParam);

    int queryListCount(AccountInfoQueryParam accountInfoQueryParam);

    List<AccountInfo> querySubUserList(AccountInfoQueryParam accountInfoQueryParam);

    int querySubUserListCount(AccountInfoQueryParam accountInfoQueryParam);

    void saveUser(AccountInfo loginUser, AddSysUserDTO addUser);

    /**
     * 添加酒店管理员
     *
     * @param loginUser
     */
    void saveUserHotel(AccountInfo loginUser);

    AccountInfo findByPrimaryKey(Integer id);


    List<AccountInfo> queryNoRoleUser(Integer type);

    List<AccountInfo> queryDeveloper(String name, Integer accountType);


    List<AccountInfo> queryAgent(String area, Integer accountType);

    /**
     * 查询用户的所有菜单ID
     */
    List<Long> queryAllMenuId(Integer userId);

    /**
     * 保存用户
     */
    void saveUser(AccountInfo user);

    /**
     * 修改用户
     */
    void update(AccountInfo user);

    /**
     * 修改用户非空字段
     */
    int updateNotNullField(AccountInfo user);

    /**
     * 修改密码
     *
     * @param userId      用户ID
     * @param password    原密码
     * @param newPassword 新密码
     */
    boolean updatePassword(Long userId, String password, String newPassword);


    boolean updateValid(Long userId, boolean valid);


    /**
     * 根据Token获取user_id
     *
     * @param token
     * @return user_id
     */
    String getUserId(String token) throws TokenInvalidException;

    /**
     * 查询父id
     *
     * @param id
     * @return
     */
    List<Integer> getParentId(Integer id);

    /**
     * 通过账户id获取账户信息
     *
     * @param userId
     * @return
     */
    AccountInfo selectByPrimaryKey(Integer userId);

    /**
     * 通过账户id获取账户信息
     *
     * @param ids
     * @return
     */
    List<AccountInfo> selectByIds(List<Integer> ids);

    /**
     * 查询用户角色ID
     *
     * @param userId
     * @return
     */
    List<Long> selectRoleIdList(Integer userId);

    /**
     * 获得Token对应用户信息
     *
     * @param token
     * @return
     */
    UserInfo tokenUserInfo(String token);

    /**
     * 全量更新账号 没有省、市、区/县 的Code值
     * 1.这个也许存在相关的风险, 但是都必须经过这个过程
     * 2.后期都是统一管理地址相关的信息
     *
     * @param status 是否全量更新， 1:只查没有code的数据更新， 2: 查询所有的进行更新
     * @return 返回更新结果
     */
    CommonResult updateAccountCode(Integer status);

    /**
     * 修改密码
     *
     * @param updatePwdParam 更新密码参数
     * @param convert        操作人
     * @return 返回结果
     */
    CommonResult updatePwd(UpdatePwdParam updatePwdParam, AccountInfo convert);

    /**
     * 分页查询 省， 市， 区/县下面的账号信息
     *
     * @param queryAccountParam 查询条件
     * @param convert           操作人
     * @return 返回分页结果
     */
    CommonResult<CommonPage<AppAccountDTO>> queryList(QueryAccountParam queryAccountParam, AccountInfo convert);

    /**
     * 分页查询子账户接口
     *
     * @param queryChildAccountParam 查询条件
     * @param convert                操作人
     * @return 返回分页结果
     */
    CommonResult<CommonPage<AppAccountDTO>> queryChildList(QueryChildAccountParam queryChildAccountParam, AccountInfo convert);

    /**
     * 禁用启用账户
     *
     * @param setAccountValidParam 设置参数信息
     * @param convert              操作人
     * @param valid                true 启用； false 禁用； null 在之前状态下取反
     * @return 返回结果
     */
    CommonResult setValid(SetAccountValidParam setAccountValidParam, AccountInfo convert, Boolean valid);

    /**
     * 得到账户最新信息
     *
     * @param getAccountParam 输入参数
     * @param convert         操作人
     * @return 返回结果
     */
    CommonResult<AppAccountDTO> getAccount(GetAccountParam getAccountParam, AccountInfo convert);

    /**
     * 获取账户的收款信息
     *
     * @param getPayAccountsParam 获取收款输入参数
     * @param convert             操作人
     * @return 返回结果
     */
    CommonResult<JsonBankInfo> getBankInfoByToken(GetPayAccountsParam getPayAccountsParam, AccountInfo convert);

    /**
     * admin - app 账户登录
     *
     * @param username 用户名
     * @param password 密码
     * @return 返回登录信息
     */
    AccountInfo loginAccount(String username, String password);

    /**
     * admin - app 忘记密码
     *
     * @param forgetPwdParam 忘记密码输入参数
     * @param accountInfo 忘记密码的操作用户
     * @return 返回结果信息
     */
    CommonResult forgetPwd(ForgetPwdParam forgetPwdParam, AccountInfo accountInfo);

    /**
     * web 添加【运营商/服务商/卡商】账户服务接口
     *
     * @param loginUser 当前操作用户
     * @param param     输入参数
     */
    void saveBusiness(AccountInfo loginUser, AddBusinessParam param);

    /**
     * 查询【运营商/卡商】集合
     *
     * @param param     搜索参数
     * @param loginUser 当前登录用户
     * @return
     */
    List<AccountInfo> listBusiness(QueryBusinessParam param, AccountInfo loginUser);

    /**
     * 查询【运营商/服务商/卡商】行数
     *
     * @param param     输入参数
     * @param loginUser 当前登录用户
     * @return
     */
    int countBusiness(QueryBusinessParam param, AccountInfo loginUser);

    /**
     * 通过酒店id查询该酒店账户对应的上级用户id(包括酒店账户id)
     *
     * @param hotelId
     * @return
     */
    List<Integer> selectParentIdByHotelId(Integer hotelId);

    /**
     * 通过酒店id查询该酒店账户对应的上级用户id(不包括酒店账户id)
     *
     * @param hotelId
     * @return
     */
    List<Integer> selectExcludeParentIdByHotelId(Integer hotelId);

    /**
     * 通过酒店id查询该酒店账户对应的所有上级(不包括酒店账户id)
     *
     * @param hotelId
     * @return （key账户id， value为账户类型）
     */
    Map<Integer, Integer> selectExcludeParentIdAndTypeByHotelId(Integer hotelId);

    /**
     * 通过账户id查询该账户对应的所有上级(不包括当前账户)
     *
     * @param accountId
     * @return （key账户id， value为账户类型）
     */
    Map<Integer, Integer> selectExcludeParentIdAndTypeById(Integer accountId);

    /**
     * 根据accountIds获取map(key账户id， value为账户类型)
     *
     * @param accountIds
     * @return
     */
    Map<Integer, Integer> getIdAndType(List<Integer> accountIds);

    /**
     * 通过部门老大id查询所有子账户id
     *
     * @param manageId 父账户id
     * @return
     */
    List<Integer> selectChildByManageId(Integer manageId);

    /**
     * 得到该酒店下 售卡商的列表信息
     *
     * @param name
     * @param hotelId 酒店Id
     * @param vipType 大v --》 1 ； 小v --》 2
     * @return
     */
    List<AccountInfo> getSalerList(String name, Integer hotelId, Integer vipType);

    /**
     * 通过账户id和账户类型查询账户信息
     *
     * @param accountId
     * @param accountType
     * @return
     */
    AccountInfo selectByIdAndType(Integer accountId, Integer accountType);

    /**
     * 通过账户id和账户类型查询佣金比例
     *
     * @param accountId   账户id
     * @param accountType 账户类型
     * @param type        1c2b, 2mattress
     * @param totalAmount 金额
     * @return
     */
    Integer selectByIdAndType(Integer accountId, Integer accountType, Integer type, Integer totalAmount);

    /**
     * 查询优享VIP 【开发商】
     * @param name 名称
     * @param developType 1, 臻享开发商， 2，优享开发商
     * @return
     */
    List<AccountInfo> findDeveloper(String name, Integer developType);

    /**
     * 分页查询运营商，卡商列表
     * @param param 查询条件
     * @param convert 操作人
     * @return
     */
    CommonResult<CommonPage<AppAccountDTO>> queryPageAppBusiness(AppQueryBusinessParam param, AccountInfo convert);

    /**
     * 卡运营商列表
     *
     * @param param
     * @return
     */
    PageResult<MemberCardOperatorListResult> selectOperatorList(MemberCardOperatorListParam param);
}
